From d69f7fd63ef736b26d45f563ca95f9fcffdffd47 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 5 Feb 2020 17:08:29 +0100 Subject: [PATCH] IconTheme: Never fail a lookup or icon load If icon lookup fails or if loading it fails later, just always fall back to the built in image-missing icon. Nobody is handling missing icons in a sane way anyway. If you *truly* need to handle missing icons, you need to manually use gtk_icon_theme_has_icon(). While changing the loading code I also fixed an issue where it was always passing "png" to pixbuf, now it also handles "xpm" if that is the filename suffix. --- demos/gtk-demo/textview.c | 2 +- gtk/gtkbuilder.c | 2 +- gtk/gtkicontheme.c | 335 ++++++++++++++++---------------------- gtk/gtkicontheme.h | 3 +- gtk/gtkmountoperation.c | 2 +- gtk/gtkwindow.c | 2 +- tests/testclipboard2.c | 2 +- tests/testdnd2.c | 2 +- testsuite/gtk/icontheme.c | 39 +---- 9 files changed, 153 insertions(+), 236 deletions(-) diff --git a/demos/gtk-demo/textview.c b/demos/gtk-demo/textview.c index b7c5b514bf..01eb503b85 100644 --- a/demos/gtk-demo/textview.c +++ b/demos/gtk-demo/textview.c @@ -141,7 +141,7 @@ insert_text (GtkTextView *view) 32, 1, gtk_widget_get_direction (widget), 0); - texture = gtk_icon_paintable_download_texture (icon, NULL); + texture = gtk_icon_paintable_download_texture (icon); g_object_unref (icon); g_assert (texture); diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index cd65388649..62e3e7ad7c 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -2174,7 +2174,7 @@ gtk_builder_value_from_string_type (GtkBuilder *builder, icon = gtk_icon_theme_lookup_icon (theme, "image-missing", NULL, 16, 1, GTK_TEXT_DIR_NONE, 0); - texture = gtk_icon_paintable_download_texture (icon, NULL); + texture = gtk_icon_paintable_download_texture (icon); pixbuf = gdk_pixbuf_get_from_texture (texture); g_object_unref (icon); g_object_unref (texture); diff --git a/gtk/gtkicontheme.c b/gtk/gtkicontheme.c index 759a7e112f..75653d84bf 100644 --- a/gtk/gtkicontheme.c +++ b/gtk/gtkicontheme.c @@ -58,6 +58,8 @@ */ #include "fallback-c89.c" +#define IMAGE_MISSING_RESOURCE_PATH "/org/gtk/libgtk/icons/16x16/status/image-missing.png" + /** * SECTION:gtkicontheme * @Short_description: Looking up icons by name @@ -84,6 +86,7 @@ * |[ * GtkIconTheme *icon_theme; * GtkIconPaintable *icon; + * GdkPaintable *paintable; * * icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (my_widget)); * icon = gtk_icon_theme_lookup_icon (icon_theme, @@ -91,16 +94,9 @@ * 48, // icon size * 1, // scale * 0, // flags); - * if (!icon) - * { - * g_warning ("No icon '%s' in theme"); - * } - * else - * { - * GdkPaintable *paintable = GDK_PAINTABLE (icon); - * // Use the paintable - * g_object_unref (icon); - * } + * paintable = GDK_PAINTABLE (icon); + * // Use the paintable + * g_object_unref (icon); * ]| */ @@ -270,8 +266,10 @@ struct _GtkIconPaintable gchar *filename; GLoadableIcon *loadable; - /* Cache pixbuf (if there is any) */ - GdkPixbuf *cache_pixbuf; +#ifdef G_OS_WIN32 + /* win32 icon (if there is any) */ + GdkPixbuf *win32_icon; +#endif /* Parameters influencing the scaled icon */ @@ -279,6 +277,7 @@ struct _GtkIconPaintable gint desired_scale; guint is_svg : 1; guint is_resource : 1; + guint is_symbolic : 1; /* Cached information if we go ahead and try to load the icon. * @@ -289,7 +288,6 @@ struct _GtkIconPaintable GMutex texture_lock; GdkTexture *texture; - GError *load_error; }; typedef struct @@ -370,7 +368,7 @@ static gboolean rescan_themes (GtkIconTheme *sel static GtkIconPaintable *icon_paintable_new (int desired_size, int desired_scale); static IconCacheFlag suffix_from_name (const gchar *name); -static gboolean icon_ensure_texture__locked (GtkIconPaintable *icon, +static void icon_ensure_texture__locked (GtkIconPaintable *icon, gboolean in_thread); static void unset_display (GtkIconTheme *self); static void update_current_theme__mainthread (GtkIconTheme *self); @@ -1811,15 +1809,15 @@ real_choose_icon (GtkIconTheme *self, key.scale = scale; key.flags = flags; - icon = icon_cache_lookup (self, &key); - if (icon) - return icon; - /* This is used in the icontheme unit test */ GTK_DISPLAY_NOTE (self->display, ICONTHEME, for (i = 0; icon_names[i]; i++) g_message ("\tlookup name: %s", icon_names[i])); + icon = icon_cache_lookup (self, &key); + if (icon) + return icon; + /* For symbolic icons, do a search in all registered themes first; * a theme that inherits them from a parent theme might provide * an alternative full-color version, but still expect the symbolic icon @@ -1859,12 +1857,33 @@ real_choose_icon (GtkIconTheme *self, { unthemed_icon = g_hash_table_lookup (self->unthemed_icons, icon_names[i]); if (unthemed_icon) - break; + { + icon = icon_paintable_new (size, scale); + + /* A SVG icon, when allowed, beats out a XPM icon, but not a PNG icon */ + if (self->pixbuf_supports_svg && + unthemed_icon->svg_filename && + (!unthemed_icon->no_svg_filename || + suffix_from_name (unthemed_icon->no_svg_filename) < ICON_CACHE_FLAG_PNG_SUFFIX)) + icon->filename = g_strdup (unthemed_icon->svg_filename); + else if (unthemed_icon->no_svg_filename) + icon->filename = g_strdup (unthemed_icon->no_svg_filename); + else + { + g_clear_object (&icon); + } + + icon->is_svg = suffix_from_name (icon->filename) == ICON_CACHE_FLAG_SVG_SUFFIX; + icon->is_resource = unthemed_icon->is_resource; + + if (icon) + goto out; + } } + #ifdef G_OS_WIN32 /* Still not found an icon, check if reference to a Win32 resource */ - if (!unthemed_icon) - { + { gchar **resources; HICON hIcon = NULL; @@ -1879,87 +1898,32 @@ real_choose_icon (GtkIconTheme *self, if (hIcon) { icon = icon_paintable_new (size, scale); - icon->cache_pixbuf = gdk_win32_icon_to_pixbuf_libgtk_only (hIcon, NULL, NULL); + icon->win32_icon = gdk_win32_icon_to_pixbuf_libgtk_only (hIcon, NULL, NULL); DestroyIcon (hIcon); + goto out; } g_strfreev (resources); } #endif - if (unthemed_icon) + + /* Fall back to missing icon */ + if (icon == NULL) { icon = icon_paintable_new (size, scale); - - /* A SVG icon, when allowed, beats out a XPM icon, but not a PNG icon */ - if (self->pixbuf_supports_svg && - unthemed_icon->svg_filename && - (!unthemed_icon->no_svg_filename || - suffix_from_name (unthemed_icon->no_svg_filename) < ICON_CACHE_FLAG_PNG_SUFFIX)) - icon->filename = g_strdup (unthemed_icon->svg_filename); - else if (unthemed_icon->no_svg_filename) - icon->filename = g_strdup (unthemed_icon->no_svg_filename); - else - { - static gboolean warned_once = FALSE; - - if (!warned_once) - { - g_warning ("Found an icon but could not load it. " - "Most likely gdk-pixbuf does not provide SVG support."); - warned_once = TRUE; - } - - g_clear_object (&icon); - goto out; - } - - icon->is_svg = suffix_from_name (icon->filename) == ICON_CACHE_FLAG_SVG_SUFFIX; - icon->is_resource = unthemed_icon->is_resource; + icon->filename = g_strdup (IMAGE_MISSING_RESOURCE_PATH); + icon->is_resource = TRUE; } out: - if (icon) - { - icon->desired_size = size; - icon->desired_scale = scale; + g_assert (icon != NULL); - icon->key.icon_names = g_strdupv ((char **)icon_names); - icon->key.size = size; - icon->key.scale = scale; - icon->key.flags = flags; + icon->key.icon_names = g_strdupv ((char **)icon_names); + icon->key.size = size; + icon->key.scale = scale; + icon->key.flags = flags; - icon_cache_add (self, icon); - } - else - { - static gboolean check_for_default_theme = TRUE; - gchar *default_theme_path; - gboolean found = FALSE; - - if (check_for_default_theme) - { - check_for_default_theme = FALSE; - - for (i = 0; !found && i < self->search_path_len; i++) - { - default_theme_path = g_build_filename (self->search_path[i], - FALLBACK_ICON_THEME, - "index.theme", - NULL); - found = g_file_test (default_theme_path, G_FILE_TEST_IS_REGULAR); - g_free (default_theme_path); - } - - if (!found) - { - g_warning ("Could not find the icon '%s'. The '%s' theme\n" - "was not found either, perhaps you need to install it.\n" - "You can get a copy from:\n" - "\t%s", - icon_names[0], FALLBACK_ICON_THEME, "http://icon-theme.freedesktop.org/releases"); - } - } - } + icon_cache_add (self, icon); return icon; } @@ -2102,7 +2066,7 @@ choose_icon (GtkIconTheme *self, * gtk_icon_theme_lookup_icon: * @self: a #GtkIconTheme * @icon_name: the name of the icon to lookup - * @fallbacks: (nullable) (array zero-terminated=1): + * @fallbacks: (nullable) (array zero-terminated=1): * @size: desired icon size. * @scale: the window scale this will be displayed on * @direction: text direction the icon will be displayed in @@ -2116,12 +2080,16 @@ choose_icon (GtkIconTheme *self, * If the available @icon_name is not available and @fallbacks are provided, * they will be tried in order. * + * If no matching icon is found, then a paintable that renders the + * "missing icon" icon is returned. If you need to do something else + * for missing icons you need to use gtk_icon_theme_has_icon(). + * * Note that you probably want to listen for icon theme changes and * update the icon. This is usually done by overriding the * #GtkWidget:css-changed function. * - * Returns: (nullable) (transfer full): a #GtkIconPaintable object - * containing the icon, or %NULL if the icon wasn’t found. + * Returns: (transfer full): a #GtkIconPaintable object + * containing the icon. */ GtkIconPaintable * gtk_icon_theme_lookup_icon (GtkIconTheme *self, @@ -2723,6 +2691,7 @@ theme_lookup_icon (IconTheme *theme, icon->filename = g_build_filename (dir->path, filename, NULL); icon->is_svg = min_suffix == ICON_CACHE_FLAG_SVG_SUFFIX; icon->is_resource = dir->is_resource; + icon->is_symbolic = icon_uri_is_symbolic (filename, -1); g_free (filename); return icon; @@ -3129,8 +3098,9 @@ gtk_icon_paintable_finalize (GObject *object) g_clear_object (&icon->loadable); g_clear_object (&icon->texture); - g_clear_object (&icon->cache_pixbuf); - g_clear_error (&icon->load_error); +#ifdef G_OS_WIN32 + g_clear_object (&icon->win32_icon); +#endif g_mutex_clear (&icon->texture_lock); @@ -3177,8 +3147,7 @@ gtk_icon_paintable_is_symbolic (GtkIconPaintable *icon) { g_return_val_if_fail (GTK_IS_ICON_PAINTABLE (icon), FALSE); - return icon->filename != NULL && - icon_uri_is_symbolic (icon->filename, -1); + return icon->is_symbolic; } static GLoadableIcon * @@ -3210,21 +3179,19 @@ icon_get_loadable (GtkIconPaintable *icon) * on the size at which to load the icon and loading it at * that size. */ -static gboolean +static void icon_ensure_texture__locked (GtkIconPaintable *icon, gboolean in_thread) { GdkPixbuf *source_pixbuf; gint64 before; gint pixel_size; + GError *load_error = NULL; icon_cache_mark_used_if_cached (icon); if (icon->texture) - return TRUE; - - if (icon->load_error) - return FALSE; + return; before = g_get_monotonic_time (); @@ -3237,9 +3204,14 @@ icon_ensure_texture__locked (GtkIconPaintable *icon, * builtin image or by loading the file */ source_pixbuf = NULL; - if (icon->cache_pixbuf) - source_pixbuf = g_object_ref (icon->cache_pixbuf); - else if (icon->is_resource) +#ifdef G_OS_WIN32 + if (icon->win32_icon) + { + source_pixbuf = g_object_ref (icon->win32_icon); + } + else +#endif + if (icon->is_resource) { if (icon->is_svg) { @@ -3247,15 +3219,23 @@ icon_ensure_texture__locked (GtkIconPaintable *icon, source_pixbuf = gtk_make_symbolic_pixbuf_from_resource (icon->filename, pixel_size, pixel_size, icon->desired_scale, - &icon->load_error); + &load_error); else source_pixbuf = _gdk_pixbuf_new_from_resource_at_scale (icon->filename, "svg", pixel_size, pixel_size, - TRUE, &icon->load_error); + TRUE, &load_error); } else - source_pixbuf = _gdk_pixbuf_new_from_resource (icon->filename, "png", &icon->load_error); + source_pixbuf = _gdk_pixbuf_new_from_resource (icon->filename, + g_str_has_suffix (icon->filename, ".xpm") ? "xpm" : "png", + &load_error); + + if (source_pixbuf == NULL) + { + g_warning ("Failed to load icon %s: %s", icon->filename, load_error->message); + g_clear_error (&load_error); + } } else { @@ -3266,7 +3246,7 @@ icon_ensure_texture__locked (GtkIconPaintable *icon, stream = g_loadable_icon_load (loadable, pixel_size, NULL, NULL, - &icon->load_error); + &load_error); g_object_unref (loadable); if (stream) @@ -3280,43 +3260,33 @@ icon_ensure_texture__locked (GtkIconPaintable *icon, source_pixbuf = gtk_make_symbolic_pixbuf_from_path (icon->filename, pixel_size, pixel_size, icon->desired_scale, - &icon->load_error); + &load_error); else source_pixbuf = _gdk_pixbuf_new_from_stream_at_scale (stream, "svg", pixel_size, pixel_size, TRUE, NULL, - &icon->load_error); + &load_error); } else - source_pixbuf = _gdk_pixbuf_new_from_stream (stream, "png", NULL, &icon->load_error); + source_pixbuf = _gdk_pixbuf_new_from_stream (stream, + g_str_has_suffix (icon->filename, ".xpm") ? "xpm" : "png", + NULL, &load_error); g_object_unref (stream); } - } - if (!source_pixbuf) - { - static gboolean warn_about_load_failure = TRUE; - - if (warn_about_load_failure) + if (source_pixbuf == NULL) { - const char *path; - - if (icon->filename) - path = icon->filename; - else if (G_IS_FILE (icon->loadable)) - path = g_file_peek_path (G_FILE (icon->loadable)); - else - path = "icon theme"; - - g_warning ("Could not load a pixbuf from %s.\n" - "This may indicate that pixbuf loaders or the mime database could not be found.", - path); - - warn_about_load_failure = FALSE; + g_warning ("Failed to load icon %s: %s", icon->filename, load_error->message); + g_clear_error (&load_error); } + } - return FALSE; + if (!source_pixbuf) + { + source_pixbuf = _gdk_pixbuf_new_from_resource (IMAGE_MISSING_RESOURCE_PATH, "png", NULL); + icon->is_symbolic = FALSE; + g_assert (source_pixbuf != NULL); } /* Actual scaling is done during rendering, so just keep the source pixbuf as a texture */ @@ -3331,24 +3301,18 @@ icon_ensure_texture__locked (GtkIconPaintable *icon, gdk_profiler_add_mark (before * 1000, (g_get_monotonic_time () - before) * 1000, in_thread ? "icon load (thread)" : "icon load" , message); g_free (message); } - - return TRUE; } /** * gtk_icon_paintable_download_texture: * @self: a #GtkIcon - * @error: (allow-none): location to store error information on failure, - * or %NULL. * - * Tries to access the pixels of an icon. This can fail if the icon file is missing or - * there is some kind of problem loading the icon file. + * Tries to access the pixels of an icon. * - * Returns: (transfer full): An texture with the contents of the icon, or %NULL on failure. + * Returns: (transfer full): An texture with the contents of the icon. */ GdkTexture * -gtk_icon_paintable_download_texture (GtkIconPaintable *self, - GError **error) +gtk_icon_paintable_download_texture (GtkIconPaintable *self) { GdkTexture *texture = NULL; @@ -3356,26 +3320,12 @@ gtk_icon_paintable_download_texture (GtkIconPaintable *self, icon_ensure_texture__locked (self, FALSE); - if (self->texture) - texture = g_object_ref (self->texture); - else - { - if (self->load_error) - { - if (error) - *error = g_error_copy (self->load_error); - } - else - { - g_set_error_literal (error, - GTK_ICON_THEME_ERROR, - GTK_ICON_THEME_NOT_FOUND, - _("Failed to load icon")); - } - } + texture = g_object_ref (self->texture); g_mutex_unlock (&self->texture_lock); + g_assert (texture != NULL); + return texture; } @@ -3451,51 +3401,48 @@ gtk_icon_paintable_snapshot_with_colors (GtkIconPaintable *icon, int texture_width, texture_height; double render_width; double render_height; + gboolean symbolic; - texture = gtk_icon_paintable_download_texture (icon, NULL); - if (texture) - { - gboolean symbolic = gtk_icon_paintable_is_symbolic (icon); + texture = gtk_icon_paintable_download_texture (icon); + symbolic = gtk_icon_paintable_is_symbolic (icon); - if (symbolic) - { - graphene_matrix_t matrix; - graphene_vec4_t offset; + if (symbolic) + { + graphene_matrix_t matrix; + graphene_vec4_t offset; - init_color_matrix (&matrix, &offset, - foreground_color, success_color, - warning_color, error_color); + init_color_matrix (&matrix, &offset, + foreground_color, success_color, + warning_color, error_color); - gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset); - } - - texture_width = gdk_texture_get_width (texture); - texture_height = gdk_texture_get_width (texture); + gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset); + } - /* Keep aspect ratio and center */ - if (texture_width >= texture_height) - { - render_width = width; - render_height = height * ((double)texture_height / texture_width); - } - else - { - render_width = width * ((double)texture_width / texture_height); - render_height = height; - } + texture_width = gdk_texture_get_width (texture); + texture_height = gdk_texture_get_width (texture); + /* Keep aspect ratio and center */ + if (texture_width >= texture_height) + { + render_width = width; + render_height = height * ((double)texture_height / texture_width); + } + else + { + render_width = width * ((double)texture_width / texture_height); + render_height = height; + } - gtk_snapshot_append_texture (snapshot, texture, - &GRAPHENE_RECT_INIT ((width - render_width) / 2, - (height - render_height) / 2, - render_width, - render_width)); + gtk_snapshot_append_texture (snapshot, texture, + &GRAPHENE_RECT_INIT ((width - render_width) / 2, + (height - render_height) / 2, + render_width, + render_width)); - if (symbolic) - gtk_snapshot_pop (snapshot); + if (symbolic) + gtk_snapshot_pop (snapshot); - g_object_unref (texture); - } + g_object_unref (texture); } diff --git a/gtk/gtkicontheme.h b/gtk/gtkicontheme.h index 5917f5f946..a780dc14a8 100644 --- a/gtk/gtkicontheme.h +++ b/gtk/gtkicontheme.h @@ -141,8 +141,7 @@ const gchar * gtk_icon_paintable_get_filename (GtkIconPaintable *se GDK_AVAILABLE_IN_ALL gboolean gtk_icon_paintable_is_symbolic (GtkIconPaintable *self); GDK_AVAILABLE_IN_ALL -GdkTexture * gtk_icon_paintable_download_texture (GtkIconPaintable *self, - GError **error); +GdkTexture * gtk_icon_paintable_download_texture (GtkIconPaintable *self); G_END_DECLS diff --git a/gtk/gtkmountoperation.c b/gtk/gtkmountoperation.c index 273b950ab8..07fc81c5c3 100644 --- a/gtk/gtkmountoperation.c +++ b/gtk/gtkmountoperation.c @@ -1180,7 +1180,7 @@ add_pid_to_process_list_store (GtkMountOperation *mount_operation, 24, 1, gtk_widget_get_direction (GTK_WIDGET (mount_operation->priv->dialog)), 0); - texture = gtk_icon_paintable_download_texture (icon, NULL); + texture = gtk_icon_paintable_download_texture (icon); g_object_unref (icon); } diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c index c296a9777f..882b0048fa 100644 --- a/gtk/gtkwindow.c +++ b/gtk/gtkwindow.c @@ -4038,7 +4038,7 @@ icon_list_from_theme (GtkWindow *window, 0); if (info) { - GdkTexture *texture = gtk_icon_paintable_download_texture (info, NULL); + GdkTexture *texture = gtk_icon_paintable_download_texture (info); if (texture) list = g_list_insert_sorted (list, texture, (GCompareFunc) icon_size_compare); diff --git a/tests/testclipboard2.c b/tests/testclipboard2.c index e4ed34db37..35b58e5167 100644 --- a/tests/testclipboard2.c +++ b/tests/testclipboard2.c @@ -292,7 +292,7 @@ get_button_list (GdkClipboard *clipboard, 48, 1, gtk_widget_get_direction (box), 0); - texture = gtk_icon_paintable_download_texture (icon, NULL); + texture = gtk_icon_paintable_download_texture (icon); g_value_take_object (&value, gdk_pixbuf_get_from_texture (texture)); g_object_unref (texture); g_object_unref (icon); diff --git a/tests/testdnd2.c b/tests/testdnd2.c index f011399525..f419c975bf 100644 --- a/tests/testdnd2.c +++ b/tests/testdnd2.c @@ -37,7 +37,7 @@ get_image_texture (GtkImage *image, gtk_widget_get_direction (GTK_WIDGET (image)), 0); if (icon) - texture = gtk_icon_paintable_download_texture (icon, NULL); + texture = gtk_icon_paintable_download_texture (icon); g_object_unref (icon); default: g_warning ("Image storage type %d not handled", diff --git a/testsuite/gtk/icontheme.c b/testsuite/gtk/icontheme.c index 8fa39b9c0d..4cbce215bc 100644 --- a/testsuite/gtk/icontheme.c +++ b/testsuite/gtk/icontheme.c @@ -96,10 +96,8 @@ assert_icon_lookup_size (const char *icon_name, if (pixbuf_size > 0) { GdkTexture *texture; - GError *error = NULL; - texture = gtk_icon_paintable_download_texture (info, &error); - g_assert_no_error (error); + texture = gtk_icon_paintable_download_texture (info); g_assert_cmpint (gdk_texture_get_width (texture), ==, pixbuf_size); g_object_unref (texture); } @@ -128,13 +126,9 @@ assert_icon_lookup_fails (const char *icon_name, info = gtk_icon_theme_lookup_icon (get_test_icontheme (FALSE), icon_name, NULL, size, 1, direction, flags); - if (info != NULL) - { - g_error ("Should not find an icon for \"%s\" with flags %s at size %d, but found \"%s\"", - icon_name, lookup_flags_to_string (flags), size, gtk_icon_paintable_get_filename (info) + strlen (g_get_current_dir ())); - g_object_unref (info); - return; - } + /* We never truly *fail*, but check that we got the image-missing fallback */ + g_assert (info != NULL); + g_assert (g_str_has_suffix (gtk_icon_paintable_get_filename (info), "image-missing.png")); } static GList *lookups = NULL; @@ -751,10 +745,9 @@ test_nonsquare_symbolic (void) g_assert_nonnull (info); g_object_unref (pixbuf); - texture = gtk_icon_paintable_download_texture (info, &error); + texture = gtk_icon_paintable_download_texture (info); /* we are loaded successfully */ - g_assert_no_error (error); g_assert_nonnull (texture); /* the original dimensions have been preserved */ @@ -768,33 +761,11 @@ test_nonsquare_symbolic (void) g_object_unref (info); } -static GLogWriterOutput -log_writer_drop_warnings (GLogLevelFlags log_level, - const GLogField *fields, - gsize n_fields, - gpointer user_data) -{ - gboolean *ignore_warnings = user_data; - - if (log_level == G_LOG_LEVEL_WARNING && *ignore_warnings) - return G_LOG_WRITER_HANDLED; - - return g_log_writer_default (log_level, fields, n_fields, user_data); -} - int main (int argc, char *argv[]) { - gboolean ignore_warnings = TRUE; - gtk_test_init (&argc, &argv); - /* Ignore the one-time warning that the fallback icon theme can’t be found - * (because we’ve changed the search paths). */ - g_log_set_writer_func (log_writer_drop_warnings, &ignore_warnings, NULL); - assert_icon_lookup_fails ("this-icon-totally-does-not-exist", 16, GTK_TEXT_DIR_NONE, 0); - ignore_warnings = FALSE; - g_test_add_func ("/icontheme/basics", test_basics); g_test_add_func ("/icontheme/lookup-order", test_lookup_order); g_test_add_func ("/icontheme/generic-fallback", test_generic_fallback); -- 2.30.2